Julia 函数
阐述
函数接受一定的输入并返回一定的输出。一个函数可以包括多个不同的 Julia 方法。可以用块形式和赋值形式定义。函数调用为传地址调用。
函数在第一个方法被定义时创建,或者也可以定义一个不包含任何方法的函数:
function emptyfunc end
每个在顶层定义的函数都有与之对应的一个 Julia 单例类型,且这个类型是 Function
的子类型。但是匿名函数不一定是单例类型。
函数类型的单例化使得高阶函数可以轻易地对作为参数的函数特化,编译出高效的代码。
julia> foo41(x) = x + 1
foo41 (generic function with 1 method)
julia> typeof(foo41)
typeof(foo41) (singleton type of function foo41, subtype of Function)
参数
函子
任何 Julia 对象都可以通过添加调用方法的方式来让它变得可以调用。
julia> struct Polynomial{R}
coeffs::Vector{R}
end
julia> function (p::Polynomial)(x)
v = p.coeffs[end]
for i = (length(p.coeffs)-1):-1:1
v = v*x + p.coeffs[i]
end
return v
end
在 Julia 内部,普通的函数也是通过(无字段的)函子来实现的,所以二者本质上是一样的。
用 do
块定义的函数
接收函数作为第一个实参的高阶函数可以将该参数用 do ... end
块后置。do
后不需要加括号。
map([A, B, C]) do x
if x < 0 && iseven(x)
return 0
elseif x == 0
return 1
else
return x
end
end
实例
定义
function f(x, y)
x + y
end
f(x, y) = x + y
f = x -> x + 1
性质
两种不同的组合函数的方式
复合运算符(从右向左运算)
(sqrt ∘ +)(3, 6)
管线运算符(从左向右运算)
1:10 |> sum |> sqrt
相关内容
文档模板
给函数写文档时,应该尽可能给函数本身或最宽泛的方法写,如果有必要再给其他方法写。
以下模板参考了 Julia SciML 风格指南和官方文档。
- 四个空格缩进的函数签名
- 一句话描述函数的行为,如有必要可以再加一段话详细描述
- 如有必要,提供
# Arguments
段 - 如有必要,提供
# Examples
段,可以使用 Julia 文档测试 - 提供指向其他函数的引用
"""
bar(x[, y])
Compute the Bar index between `x` and `y`.
If `y` is unspecified, compute the Bar index between all pairs of columns of `x`.
## Examples
`julia-repl
julia> bar([1, 2], [1, 2])
1
`
See also [`bar!`](@ref), [`baz`](@ref), [`baaz`](@ref).
"""
function bar(x, y) ...